macro_rules! recognize_tree {
    (larch) => {
        println!("#1, the Larch.")
    };
    (redwood) => {
        println!("#2, the Mighty Redwood.")
    };
    (fir) => {
        println!("#3, the Fir.")
    };
    (chestnut) => {
        println!("#4, the Horse Chestnut.")
    };
    (pine) => {
        println!("#5, the Scots Pine.")
    };
    ($($other:tt)*) => {
        println!("I don't know; some kind of birch maybe?")
    };
}

macro_rules! expand_to_larch {
    () => {
        larch
    };
}

macro_rules! callback {
    ($call:ident) => {
        $call!(larch)
    };
}
fn main() {
    recognize_tree!(expand_to_larch!());
    callback!(recognize_tree);
    // first expands to:  recognize_tree! { expand_to_larch ! (  ) }
    // and then:          println! { "I don't know; some kind of birch maybe?" }
}
